<!DOCTYPE HTML>
<html>
<head>
    <title>MINIMMORTS HTML5 bot</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script type="text/javascript" src="js/constants.js"></script>
    <script type="text/javascript" src="js/resources.js"></script>
    <script type="text/javascript" src="js/routines.js"></script>
    
    <script type="text/javascript" src="js/Camera.js"></script>
    <script type="text/javascript" src="js/Unit.js"></script>
    <script type="text/javascript" src="js/SpriteLoader.js"></script>
    <script type="text/javascript" src="js/Map.js"></script>
    <script type="text/javascript" src="js/Movement.js"></script>
    <script type="text/javascript" src="js/MovementManager.js"></script>
    <script type="text/javascript" src="js/messages.js"></script>
    <script type="text/javascript" src="js/ServerInteraction.js"></script>
    <script type="text/javascript" src="js/Sprite.js"></script>
    <script type="text/javascript" src="js/SpriteMovement.js"></script>
    <script type="text/javascript" src="js/SpriteMovementWayPoint.js"></script>
    <script type="text/javascript" src="js/ActionManager.js"></script>
</head>
<body>

<script type="text/javascript">

/*************************
 * Служебные переменные. *
 *************************/

// debug
var DEBUG = false;

var DEBUG_PROTOCOL = false;

var DEBUG_UNITS = false;

var DEBUG_MOVEMENTS = false;

// Список юнитов, принадлежащих клиенту.
var self_units_list = new Array();

// Список юнитов.
var units_list = new Array();

// Карта.
var map;

// Сервер.
var server;

// Камера. В её объекиве находится место, которое будет нарисовано на основном холсте.
var camera;

// Камера свободна или привязана к своему игроку.
var is_camera_free = false;

// Буфер действий.
var actions = new Array();

// Действия, которые должны быть выполнены после получения подтверждения.
var stored_actions;

// Номер текущего хода.
var step;

// Id этого клиента.
var clientId;

// Выделенные юниты.
var selected_units = new Array();

// Клетка начала выделения.
var selections_beg;

// Прямоугольник выделения.
var selection_rect = null;

// Менеджер движения.
var movementManager = new MovementManager();

// Менеджер действий.
var actionManager = new ActionManager();

var smoothMovementEnabled = true;

var prevDrawTime = null;

var aiTimer = null;

var reconnectTimer = null;

var connectTimer = null;

/*
 * Вероятность того, что бот проигнорирует сообщение CONFIRM от сервера. Это
 * нужно для эмуляции лагов клиента. null означает, что игнорирование выключено.
 */
var ignoreConfirmProbability = 500;

/*
 * Вероятность того, что бот переподключится к серверу. null означает, что
 * переподключение выключено.
 */
var reconnectProbability = 500;

var autoReconnect = true;

var saveUnitHistory = false;

/************
 * Функции. *
 ************/

function connect() {
    server = new ServerInteraction();
    server.connect("ws://localhost:8015/");
}

function disconnect() {
    if (server != undefined && server.socket != null) {
        server.socket.close()
    } else {
        console.log("Отключение от сервера не удалось: север не создан или сокет не инициализирован.")
    }
}

function reconnect() {
    if (server != undefined && server.socket != null) {
        server.socket.close()
    } else {
        console.log("Отключение от сервера не удалось: север не создан или сокет не инициализирован.")
    }
    
    connectTimer = setTimeout(connect, 2000);
}

function aiLoop() {
    actionManager.createRandomMovementRequests();
    if (reconnectProbability != null && getRandomInt(reconnectProbability) == 0) {
        reconnectTimer = setTimeout(reconnect, 2000);
        if (DEBUG) {
            console.log("Переподключение.");
        }
    } else {
        aiTimer = setTimeout(aiLoop, 2000);
    }
}

function syncLoop() {
    var i, unit, actions;
    
    for (i in stored_actions) {
        switch (stored_actions[i].type) {
            case "MOVE":
                if ( (unit = getUnitById(stored_actions[i].unitId)) == null) {
                    console.log("Сохранённое действие не может быть выполнено. Юнит id=" + stored_actions[i].unitId + " не найден.");
                    continue;
                }
                if (movementManager.isUnitMove(unit)) {
                    movementManager.updateMovement(
                        step,
                        unit,
                        stored_actions[i].endJ,
                        stored_actions[i].endI
                    );
                } else {
                    movementManager.startNewMovement(
                        step,
                        unit,
                        unit.getJ(),
                        unit.getI(),
                        stored_actions[i].endJ,
                        stored_actions[i].endI
                    );
                    //console.log("Movement created on step ", step);
                }
                break;
        }
    }
    
    step++;
    
    movementManager.updatePositions(step);

    var unitMessages = new Array();
    for (i in self_units_list) {
        unitMessages.push(new UnitMessage(self_units_list[i].getOwnerId(), self_units_list[i].getId(), self_units_list[i].getJ(), self_units_list[i].getI()));
    }
    for (i in units_list) {
        unitMessages.push(new UnitMessage(units_list[i].getOwnerId(), units_list[i].getId(), units_list[i].getJ(), units_list[i].getI()));
    }
    actions = actionManager.takeMovementRequests();
    server.sendMessage(new MessagePacket(new StateReportMessage(step, unitMessages, actions)));
    stored_actions = actions;
}

</script>

<script type="text/javascript">
connect();
</script>

</body>
</html>
